ggplot2(5)-折线图

数据集

查看数据集,如下所示:

1
2
3
4
5
6
7
8
> BOD
Time demand
1 1 8.3
2 2 10.3
3 3 19.0
4 4 16.0
5 5 15.6
6 7 19.8

基础绘图

1
ggplot(BOD,aes(x=Time,y=demand))+geom_line()

mark

x轴的变量为分类变量的折线图

1
2
3
BOD1 <- BOD
BOD1$Time <- factor(BOD1$Time)
ggplot(BOD1,aes(x=Time,y=demand,group=1))+geom_line()

上一段代码中,group=1表示这些数据点属于一组,用一条折线将其连接起来。并且注意与第1张图在x轴坐标上的区别。 mark

扩大y轴的范围

下面的这段代码用ylim(0,max(BOD$demand))将y轴的范围进行修改,如下所示:

1
2
3
ggplot(BOD,aes(x=Time,y=demand))+geom_line()+ylim(0,max(BOD$demand))
# 等价于:
# ggplot(BOD,aes(x=Time,y=demand))+geom_line()+expand_limits(y=0)

mark

向折线图添加数据标记

向折线图中添加数据点

1
ggplot(BOD,aes(x=Time,y=demand))+geom_line()+geom_point()

mark

再来看一个案例,如下所示:

1
2
library(gcookbook)
ggplot(worldpop,aes(x=Year,y=Population))+geom_line()+geom_point()

mark

可以看到,数据集中在右侧,现在对y取以10为底的对数:

1
ggplot(worldpop,aes(x=Year,y=Population))+geom_line() + geom_point() + scale_y_log10()

mark

绘制多重折线图

下面的代码绘制多重折线图,里面有两个分类用颜色来区分不同的分类(supp)

1
2
3
4
5
library(plyr)
tg <- ddply(ToothGrowth,c("supp","dose"),summarise,length=mean(len))
# 这一段话的意思是,对ToothGrowth的数据集进行处理,将其按照supp与dose进行分类,增加一列为length,length的值是分类后的len的值
ggplot(tg,aes(x=dose,y=length,colour=supp)) + geom_line()

mark

用线型(linetype)来区分不同的分类(supp)

1
ggplot(tg,aes(x=dose,y=length,linetype=supp)) + geom_line()

mark

现在将x轴转化为分类变量

上面的例子中,dose为连续型变量,转化后注意一下x轴的变化。

1
ggplot(tg,aes(x=factor(dose),y=length,colour=supp,group=supp)) + geom_line()

注意,上面的代码中,需要加入group=supp这个参数。 mark

现在看一个反例,在这个案例中,没有指定正确的分组,如下所示:

1
ggplot(tg,aes(x=dose,y=length)) + geom_line()

mark

当没有指定的分组时,x轴上的每个位置就是对应多个点,ggplot()就会将这些点都放在同一个组中,并且将它们用一根折线连接,开场锯齿状折线图。如果指定任意离散型变量,映射给colour,linetype的话,则会出现折线图的分组,如下所示:

1
ggplot(tg,aes(x=dose,y=length,colour=supp)) + geom_line()

mark

修改点的形状

可以增加点的形状属性(用shape=supp)

1
ggplot(tg,aes(x=dose,y=length,shape=supp)) + geom_line() + geom_point(size=4)

mark

修改点的颜色

可以增加点的形状属性(用shape=supp) 修改点的颜色的时候,要用到fill参数与shape参数,如只用fill,而不用shape的时候,则颜色不会出现,这个时候只是单纯的一个点,不会出现内部的颜色,只有当shape参数设置后,颜色才能出现。

1
ggplot(tg,aes(x=dose,y=length,fill=supp)) + geom_line() + geom_point(size=4,shape=21)

mark

修改颜色属性:错开重复的点:

在上一个图形中,右边最后一个点两条折线重合了,现在要改一下,避开两点的重合,如下所示:

1
2
3
4
ggplot(tg,aes(x=dose,y=length,shape=supp))+
geom_line(position=position_dodge(0.2))+
# 将线左右移开0.2,左线往左移,右线往右移
geom_point(position=position_dodge(0.2),size=4)

mark

修改线条样式

线条样式的属性有线型(linetype)、线宽(size)、颜色(colour)。下面的例子是更改线型为虚线(dashed),蓝色(blue):

1
2
ggplot(BOD,aes(x=Time,y=demand))+
geom_line(linetype="dashed",size=1,colour="blue")

mark

其它颜色设置,如下所示:

线条颜色

1
2
3
4
library(RColorBrewer)
ggplot(tg,aes(x=dose,y=length,colour=supp))+
geom_line()+
scale_colour_brewer(palette="Pastel1")

mark

线条加粗

1
2
ggplot(tg,aes(x=dose,y=length,group=supp))+
geom_line(colour="darkgreen",size=2)

mark

虚线加形状

1
2
3
ggplot(tg,aes(x=dose,y=length,colour=supp))+
geom_line(linetype="dashed")+
geom_point(shape=22,size=3,fill="white")

mark

修改数据标记

修改数据点的样式,包括点的大小(size)、颜色(colour),填充色(fill)

修改颜色与形状

1
2
3
ggplot(BOD,aes(x=Time,y=demand))+
geom_line()+
geom_point(size=4,shape=22,colour="green",fill="pink")

mark

修改颜色与形状2

1
2
3
ggplot(BOD,aes(x=Time,y=demand))+
geom_line()+
geom_point(size=4,shape=21,fill="white")

mark

将不同的分类的标记点修改为不同的属性

1
2
3
4
5
pd <- position_dodge(0.2)
ggplot(tg, aes(x=dose,y=length,fill=supp))+
geom_line(position=pd)+
geom_point(shape=21,size=3,position=pd)+
scale_fill_manual(values=c("black","white"))

mark

绘制面积图

基础绘图

以下的数据集是一个时间序列数据集,如下所示:

1
2
3
4
5
sunspotyear <- data.frame(
Year = as.numeric(time(sunspot.year)),
Sunspots = as.numeric(sunspot.year)
)
ggplot(sunspotyear,aes(x=Year,y=Sunspots))+geom_area()

mark

修改面积颜色属性

1
2
ggplot(sunspotyear,aes(x=Year,y=Sunspots))+
geom_area(colour="black",fill="green",alpha=0.2)

mark

修改颜色底部边框属性:

把上图中的底部横线去掉,即在geom_are()中去掉colour=”black”,此语气的意思是给面积部分加上边框。

1
2

mark

去掉所有边框

若无geom_line()参数,则图形直接为面积,没有边框:

1
2
ggplot(sunspotyear,aes(x=Year,y=Sunspots))+
geom_area(fill="green",alpha=0.2)

mark

绘制堆积面积图

基础绘图

查看数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
head(uspopage,10) # 查看uspopage数据集的前10行
## Year AgeGroup Thousands
## 1 1900 <5 9181
## 2 1900 5-14 16966
## 3 1900 15-24 14951
## 4 1900 25-34 12161
## 5 1900 35-44 9273
## 6 1900 45-54 6437
## 7 1900 55-64 4026
## 8 1900 >64 3099
## 9 1901 <5 9336
## 10 1901 5-14 17158
str(uspopage) # 查看数据集的格式
## 'data.frame': 824 obs. of 3 variables:
## $ Year : int 1900 1900 1900 1900 1900 1900 1900 1900 1901 1901 ...
## $ AgeGroup : Factor w/ 8 levels "<5","5-14","15-24",..: 1 2 3 4 5 6 7 8 1 2 ...
## $ Thousands: int 9181 16966 14951 12161 9273 6437 4026 3099 9336 17158 ...

绘图

1
ggplot(uspopage,aes(x=Year,y=Thousands,fill=AgeGroup)) + geom_area()

mark

注意上图中图例的位置,图例中的年龄分组顺序与主图中的年龄分组顺序是相反的。下面的代码将这二者调为一致:

1
2
3
4
ggplot(uspopage,aes(x=Year,y=Thousands,fill=AgeGroup))+
geom_area(colour="black",size=0.2,alpha=0.4)+
scale_fill_brewer(palette="Blues",breaks=rev(levels(uspopage$AgeGroup)))
# rev用于将因子顺序倒置,即将图例中的顺序倒置

mark

反转堆积图顺序

上图从下往上是按照年龄由小至大的顺序堆积的,现在按照由大到小堆积:

1
2
3
ggplot(uspopage,aes(x=Year,y=Thousands,fill=AgeGroup,order=desc(AgeGroup)))+
geom_area(colour="black",size=0.2,alpha=0.4)+
scale_fill_brewer(palette="Blues")

mark

desc()函数

注意上一段代码中的desc()函数,下面为例说明一下:

1
2
3
4
5
x <- c(1,2,3,9,3,2,1) # 建立一个普通的向量
x
##[1] 1 2 3 9 3 2 1
desc(x)
## [1] -1 -2 -3 -9 -3 -2 -1

可以发现,desc()的功能是将x中的元素前面加一个负号,x是一个普通的向量,其元素是数值,如果x的元素是因子型向量的话,结果如下:

1
2
3
4
5
6
x <- factor(x)
x # 可以发现,x中有四个水平,即1、2、3、9
## [1] 1 2 3 9 3 2 1
## Levels: 1 2 3 9
desc(x) # 这个显示的是x中因子水平的排序的负值
## [1] -1 -2 -3 -4 -3 -2 -1

再看一个例子,如下所示:

1
2
3
4
5
y <- factor(c("a","c","b","b","d"))
str(y)
## Factor w/ 4 levels "a","b","c","d": 1 3 2 2 4
desc(y)
## [1] -1 -3 -2 -2 -4

堆叠去掉两边的边框

将上一个堆叠图中的边框去掉:

1
2
3
4
ggplot(uspopage,aes(x=Year,y=Thousands,fill=AgeGroup,order=desc(AgeGroup)))+
geom_area(colour=NA,alpha=0.4)+
scale_fill_brewer(palette="Blues")+
geom_line(position="stack",size=0.2)

mark

上述代码的最后一行是绘制曲线,如果去掉,则剩余的代码只是单纯的堆积图:

1
2
3
ggplot(uspopage,aes(x=Year,y=Thousands,fill=AgeGroup,order=desc(AgeGroup)))+
geom_area(colour=NA,alpha=0.4)+
scale_fill_brewer(palette="Blues")

mark

绘制百分比堆积面积图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
uspopage_prop <- ddply(uspopage,"Year",transform,Percent = Thousands/sum(Thousands)*100)
# 上段代码的意思是把数据集uspopage中的数据按照Year进行分类,在分类内部,计算每个Thousands所占的百分比,并把计算的结果给Percent
head(uspopage_prop,10)
## Year AgeGroup Thousands Percent
## 1 1900 <5 9181 12.065340
## 2 1900 5-14 16966 22.296107
## 3 1900 15-24 14951 19.648067
## 4 1900 25-34 12161 15.981549
## 5 1900 35-44 9273 12.186243
## 6 1900 45-54 6437 8.459274
## 7 1900 55-64 4026 5.290825
## 8 1900 >64 3099 4.072594
## 9 1901 <5 9336 12.033409
## 10 1901 5-14 17158 22.115385

绘图,如下所示:

1
2
3
ggplot(uspopage_prop,aes(x=Year,y=Percent,fill=AgeGroup))+
geom_area(colour="black",size=0.2,alpha=0.4)+
scale_fill_brewer(palette="Blues",breaks=rev(levels(uspopage$AgeGroup)))

mark

添加置信域

置信域中用到的数据集是climate,如下所示:

1
2
3
4
5
6
7
8
9
head(climate)
## Source Year Anomaly1y Anomaly5y Anomaly10y Unc10y
## 1 Berkeley 1800 NA NA -0.435 0.505
## 2 Berkeley 1801 NA NA -0.453 0.493
## 3 Berkeley 1802 NA NA -0.460 0.486
## 4 Berkeley 1803 NA NA -0.493 0.489
## 5 Berkeley 1804 NA NA -0.536 0.483
## 6 Berkeley 1805 NA NA -0.541 0.475

变量Anomaly10y表示的意思是相对于1950-1980平均水平变异的10年移动平均。变量Unc10y表示其95%置信区间。现在令ymax与ymin分别为Anomaly10y加减Unc10y,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
clim <- subset(climate,Source == "Berkeley",
select = c("Year","Anomaly10y","Unc10y"))
# 上面一段代码表示,取数据集中climate的Source中的Berkeley,并选择其中的Year,Anomaly10y,unc10y
head(clim)
## Year Anomaly10y Unc10y
## 1 1800 -0.435 0.505
## 2 1801 -0.453 0.493
## 3 1802 -0.460 0.486
## 4 1803 -0.493 0.489
## 5 1804 -0.536 0.483
## 6 1805 -0.541 0.475

下面绘制置信区间,用到的是geom_ribbon()函数:

1
2

mark

绘制上下边界

这个例子是用虚线来表示上下置信区间:

1
2
3
4
ggplot(clim,aes(x=Year,y=Anomaly10y))+
geom_line(aes(y=Anomaly10y-Unc10y),colour="grey50",linetype="dotted")+
geom_line(aes(y=Anomaly10y+Unc10y),colour="grey50",linetype="dotted")+
geom_line()

mark

参考资料

  1. 常肖楠, 邓一硕, 魏太云. R数据可视化手册[M]. 人民邮电出版社, 2014.